package com.dxf.chepter06

/**
 * trait 特质:  类似接口
 * 特质:
 * 类与类之间只支持单继承
 * 类与特质直接可以多继承
 * scala的特质中有普通字段,抽象字段,普通方法,抽象方法
 * 叫法:
 * 1 特质中只有抽象内容,这样的特质叫      瘦接口
 * 2 特质中既有内容,又又具体内容,叫       富接口
 *
 * 定义特质
 * trait 名称{
 * //普通字段
 * //抽象洗的
 * //普通方法
 * //抽象方法
 * }
 *
 * 继承特殊值
 *
 * class 类名 extents 特质1 with 特质2 with 特质3 {
 * //重写抽象方法
 * //重写抽象字段
 * //可重写普通字段和普通方法
 * }
 *
 *
 * =====================================
 *
 *
 * 对象混入 :
 * 类和特质直接无任何关系,在不改变继承体系下,对对象的功能进行增强或者扩展,使用对象混入计数
 *
 * 语法:
 * var/val 对象名 = new 类 with 特质
 *
 *
 *
 * =====================================
 *
 *
 * 特质实现适配器模式
 *
 * 适配器模式:
 * 1 当我们需要用到某几个方法时,不得不将改特质中的所有抽象方法重写 麻烦
 * 2 针对这种情况,我们可以定义一个抽象类去继承该特质,重写特质中的[所有]抽象方法,[所有]抽象方法体为空
 * 3 这时候,我们需要使用哪个方法,只需要定义类去继承抽象类,重写指定方法即可
 * 这个抽象类 就叫做适配器类
 *
 *
 * 结构:  类B为适配器类角色
 * trait 特质A{
 *
 * 抽象方法1
 * 抽象方法2
 * 抽象方法3
 *
 * }
 *
 * abstract class 类B extends 特质A {
 * 重写抽象方法1,方法体为空
 * 重写2 空
 * 重写3 空
 *
 *
 * }
 *
 *
 * class 类C extends 类B {
 * //需要使用哪个方法,重写哪个方法
 * }
 *
 * ===========================================================
 *
 *
 * 模板方法设计模式
 * 父类中实现模板方法(固定的方法)和抽象方法(不缺定的方法)
 * 子类自己实现抽象方法
 * 优点:
 * 1 扩展性更强
 * 2 符合开闭原则
 * 缺点:
 * 1 类个数增加 设计更加抽象
 *
 * 2 提高代码阅读难度
 *
 *
 * demo 打印110000字需要多少时间
 *
 * ==============================================================
 *
 *
 * 职责链
 * 多个trait中出现了同一个方法,且该方法最后都调用super.该方法名()
 * ,当类继承了多个trait后,就可以依次调用多个trait中的此同一个方法
 * 形成调用链
 *
 *
 * 执行顺序:
 * 1 从右往左
 * 2 子类执行完毕后,执行父类中的此方法
 *
 * 格式 :
 * trait A{
 * def show()
 * }
 *
 * trait B extends A{
 * override def show(){
 * ....
 *      super.show()
 * }
 * }
 *
 * trait C extends A{
 * override def show(){
 * ...
 *      super.show()
 * }
 * }
 *
 * class D extends B with C {
 * def 方法名()={
 *      super.show()           // B 和  C中都有show()方法,会从右往左执行, 级 先 c.show(), 在 b.show()
 * }
 *
 * }
 *
 *
 * =================================================
 *
 *
 * trait 构造机制
 * '  一个类继承某个父类且继承多个父特质,那么该类(子类) 该类的父类,以及该类的父特质之间是如何构造的?
 *
 *  1 每个特质只有一个无参数构造器
 *  2 如果一个类继承另一个类,和多个特质,当创建改类实例时,构造器执行顺序如下
 *      2.1 执行父类构造器
 *      2.2 从左到右顺序,依次执行trait的构造器
 *      2.3 如果trait有父trait,先执行父trait构造器
 *      2.4 如果多个trait有同样的父trait 则 父trait的构造器只初始化一次
 *      2.5 执行子构造器
 *
 *
 * ========================================================
 *
 */
object T71_trait构造机制 {
  def main(args: Array[String]): Unit = {

    val a = new A001
  }



   class A002{
     println("[1] class A002")
   }

  class A001 extends A002 with B002 with B003 {
    println("[5] class A001")
  }

  trait  B001{
    println("[3] trait B001")
  }

  trait B002{
    println("[2] trait B002")
  }

  trait B003 extends B001{
    println("[4] trait B003")
  }

}

